module uart #(
    parameter integer CLK_FREQ   = 50000000,
    parameter integer BAUDRATE   = 115200,
    parameter integer OVERSAMPLE = 8
) (
    input wire sys_clk,
    input wire rst_n,
    input wire [7:0] din,
    input wire wr_en,
    output wire tx,
    output wire tx_busy,
    input wire rx,
    input wire rdy_clr,
    output wire rdy,
    output wire [7:0] dout
);

  wire rxclk_en, txclk_en;
  wire rxclk_gen_ena, txclk_gen_ena;

  baud_rate_gen #(
      .CLK_FREQ  (CLK_FREQ),
      .BAUDRATE  (BAUDRATE),
      .OVERSAMPLE(OVERSAMPLE)
  ) uart_baud (
      .sys_clk(sys_clk),
      .rst_n(rst_n),
      .rxclk_gen_ena(rxclk_gen_ena),
      .txclk_gen_ena(txclk_gen_ena),
      .rxclk_en(rxclk_en),
      .txclk_en(txclk_en)
  );
  transmitter uart_tx (
      .sys_clk(sys_clk),
      .rst_n(rst_n),
      .clken(txclk_en),
      .txclk_gen_ena(txclk_gen_ena),
      .din(din),
      .wr_en(wr_en),
      .tx(tx),
      .tx_busy(tx_busy)
  );
  receiver #(
      .OVERSAMPLE(OVERSAMPLE)
  ) uart_rx (
      .sys_clk(sys_clk),
      .rst_n(rst_n),
      .clken(rxclk_en),
      .rxclk_gen_ena(rxclk_gen_ena),
      .rx(rx),
      .rdy(rdy),
      .rdy_clr(rdy_clr),
      .data(dout)
  );

endmodule
